////////////////////////////////////////////////////////////////////////////////

#ifndef _SERVER_ENGINE_H_
#define _SERVER_ENGINE_H_

////////////////////////////////////////////////////////////////////////////////

#include <map>
#include <boost/asio.hpp>

////////////////////////////////////////////////////////////////////////////////

#include "battlefield.h"

////////////////////////////////////////////////////////////////////////////////

class Server;
struct ClientPacket;
struct ServerPacket;


/** Game server engine
*
*  @author   Roman Pasechnik
*  @since    Jun 04th, 2009
*  @updated  Jun 05th, 2009
*/
class ServerEngine
{
////////////////////////////////////////////////////////////////////////////////

public:

////////////////////////////////////////////////////////////////////////////////


    /** Constructor */
    ServerEngine( boost::asio::io_service& _io_service );


    /** Destructor */
    virtual ~ServerEngine();


////////////////////////////////////////////////////////////////////////////////


    /** Start engine */
    void Start( Server* _coordinator );


    /** Process engine logic */
    void Receive( const ClientPacket& _packet );


////////////////////////////////////////////////////////////////////////////////

private:

////////////////////////////////////////////////////////////////////////////////


    /** Process engine logic */
    void ProcessLogic();


    /** Process collisions logic */
    void ProcessCollisions();


    /** Process movement logic */
    void ProcessMovement();


    /** Process shooting logic */
    void ProcessShooting();


////////////////////////////////////////////////////////////////////////////////


    /** Engine logic and networking */
    void RunEngineLoop( const boost::system::error_code& _error );


////////////////////////////////////////////////////////////////////////////////


    /** Fetch packet for clients */
    void FetchServerPacket( ServerPacket& _packet );


////////////////////////////////////////////////////////////////////////////////


    /** Set object's velocity */
    void SetPlayerVelocity( unsigned char _playerID, Player& _player );


////////////////////////////////////////////////////////////////////////////////


    /** Battle arena */
    Battlefield m_Battlefield;


////////////////////////////////////////////////////////////////////////////////


    /** IO service for deadline timer */
    boost::asio::io_service& m_io_service;


    /** Deadline timer for repeating game loop */
    boost::asio::deadline_timer m_Timer;


    /** Time of one game loop */
    enum
    {
        WAIT_TIME = 30
    };


////////////////////////////////////////////////////////////////////////////////


    /** Server */
    Server* m_Server;


////////////////////////////////////////////////////////////////////////////////
};


////////////////////////////////////////////////////////////////////////////////

#endif

////////////////////////////////////////////////////////////////////////////////

